#include <ncurses.h>

typedef struct _win_border_struct {
	chtype ls, rs, ts, bs,
		   tl, tr, bl, br;
} WIN_BORDER;

typedef struct _WIN_struct {
	int startx, starty;
	int height, width;
	WIN_BORDER border;
} WIN;
void init_win_params(WIN *p_win);
void print_win_params(WIN *p_win);
void create_box(WIN *p_win, bool flag);

int _moverect(char *argv[])
{
	
	/* check the number of cmd-line parameters is correct */
	int argc = 0;
	for (char **ptr = argv; *ptr != NULL; ptr++)
		argc++;

	if (argc != 1) {
		fprintf(stderr, "Usage: move\n");
		return -1;
	}

	WIN win;
	int ch;

	initscr();
	curs_set(0); // hide the cursor
	start_color();
	cbreak();

	keypad(stdscr, TRUE);
	noecho();
	init_pair(1, COLOR_CYAN, COLOR_BLACK);

	/* Initialize the window parameters */
	init_win_params(&win);
	print_win_params(&win);


	create_box(&win, TRUE);
	while ((ch = getch()) != KEY_F(1)) {
		switch (ch) {
			case KEY_LEFT:
				create_box(&win, FALSE);
				--win.startx;
				create_box(&win, TRUE);
				break;
			case KEY_RIGHT:
				create_box(&win, FALSE);
				++win.startx;
				create_box(&win, TRUE);
				break;
			case KEY_UP:
				create_box(&win, FALSE);
				--win.starty;
				create_box(&win, TRUE);
				break;
			case KEY_DOWN:
				create_box(&win, FALSE);
				++win.starty;
				create_box(&win, TRUE);
				break;
		}
	}

	endwin();
	return 0;
}

void init_win_params(WIN *p_win) {
	p_win->height = 3;
	p_win->width = 10;
	p_win->starty = (LINES - p_win->height) / 2;
	p_win->startx = (COLS - p_win->width) / 2;

	p_win->border.ls = '|';
	p_win->border.rs = '|';
	p_win->border.ts = '-';
	p_win->border.bs = '-';
	p_win->border.tl = '+';
	p_win->border.tr = '+';
	p_win->border.bl = '+';
	p_win->border.br = '+';
}
void print_win_params(WIN *p_win) {
#ifdef _DEBUG
	mvprintw(25, 0, "%d %d %d %d", p_win->startx,
								   p_win->starty
								   p_win->width
								   p_win->height);
	refresh();
#endif
}
void create_box(WIN *p_win, bool flag) {
	curs_set(0);
	int i, j;
	int x, y, w, h;

	x = p_win->startx;
	y = p_win->starty;
	w = p_win->width;
	h = p_win->height;

	attron(COLOR_PAIR(1) | A_BOLD | A_UNDERLINE);
	mvprintw(0, 0, "Press F1 to exit");
	move(y, x);
	attroff(COLOR_PAIR(1) | A_BOLD | A_UNDERLINE);

	if (flag == TRUE) {
		mvaddch(y, x, p_win->border.tl);
		mvaddch(y, x + w, p_win->border.tr);
		mvaddch(y + h, x, p_win->border.bl);
		mvaddch(y + h, x + w, p_win->border.br);

		mvhline(y, x + 1, p_win->border.ts, w - 1);
		mvhline(y + h, x + 1, p_win->border.bs, w - 1);
		mvvline(y + 1, x, p_win->border.ls, h - 1);
		mvvline(y + 1, x + w, p_win->border.rs, h - 1);
	} else {
		for (j = y; j <= y + h; ++j) {
			for (i = x; i <= x + w; ++i) 
				mvaddch(j, i, ' ');
		}
	}

	refresh();
}
